package com.mayfool.gitmanager.ui;

import com.mayfool.gitmanager.core.entity.ProjectInfo;
import com.mayfool.gitmanager.core.manager.ProjectManager;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author zhou.xu
 * @description: 项目选择器组件
 * 提供项目选择功能，使用表格展示可选项目列表
 * 支持多选，并通过ChangeListener通知选择变更
 * @date 2025/3/10 18:16
 * @since JDK 1.8
 */
public class ProjectChooser extends JPanel {

    /**
     * 已选择的项目列表
     */
    private List<ProjectInfo> projectInfos;

    /**
     * 状态变更监听器列表
     */
    private final List<ChangeListener> changeListeners;

    /**
     * 构造函数
     * @param text 选择按钮显示的文本
     */
    public ProjectChooser(String text) {
        changeListeners = new ArrayList<>();
        JButton selectProjectBtn = new JButton(text);
        // 添加按钮点击事件，显示项目选择对话框
        selectProjectBtn.addActionListener(e -> {
            projectInfos = handleSelectProjects();
            fireChange();
        });
        add(selectProjectBtn);
    }

    /**
     * 添加状态变更监听器
     * @param listener 监听器对象
     */
    public void addChangeListener(ChangeListener listener) {
        changeListeners.add(listener);
    }

    /**
     * 触发状态变更事件
     * 通知所有监听器项目选择已更改
     */
    private void fireChange() {
        ChangeEvent changeEvent = new ChangeEvent(this);
        changeListeners.forEach(changeListener -> changeListener.stateChanged(changeEvent));
    }

    /**
     * 处理项目选择
     * 显示项目选择对话框，让用户从表格中选择项目
     * @return 用户选择的项目列表，如果取消则返回空列表
     */
    private List<ProjectInfo> handleSelectProjects() {
        // 创建项目表格模型
        ProjectTableModel model = new ProjectTableModel(ProjectManager.getProjects());
        JTable projectTable = new JTable(model);
        projectTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        
        // 创建带滚动条的表格面板
        JScrollPane tableScroll = new JScrollPane(projectTable);

        // 创建对话框面板
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(tableScroll, BorderLayout.CENTER);

        // 显示项目选择对话框
        int result = JOptionPane.showConfirmDialog(this, panel, "选择已有项目",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

        if (result == JOptionPane.OK_OPTION) {
            // 获取选中的行，并转换为ProjectInfo对象列表
            int[] selectedRows = projectTable.getSelectedRows();
            return Arrays.stream(selectedRows)
                    .mapToObj(model::getProjectInfo)
                    .collect(Collectors.toList());
        }
        return Collections.emptyList();
    }

    /**
     * 获取已选择的项目列表
     * @return 项目信息列表
     */
    public List<ProjectInfo> getProjectInfos() {
        return projectInfos;
    }
}
